/*
* @(#) KMP.java 2018年02月26日
*
* Copyright 2010 NetEase.com, Inc. All rights reserved.
*/
package com.leo.m1802.d26;

/**
 *
 * @author xuexiaolei
 * @version 2018年02月26日
 */
public class KMP {
    private int[] getNext(String p){
        int[] next = new int[p.length()];
        next[0] = -1;
        int i=0,j=-1;
        while (i<p.length()){
            if (j==-1 || p.charAt(i)==p.charAt(j)){
                i++;
                j++;
                next[i]=j;
            }else {
                j = next[j];
            }
        }
        return next;
    }

    public int kmpSearch(String s, String p){
        int[] next = getNext(p);
        int i=0,j=0;
        while (i<s.length() && j<p.length()){
            if (j==-1 || s.charAt(i)==p.charAt(j)){
                i++;
                j++;
            }else {
                j=next[j];
            }
        }
        if (j==p.length()){
            return i-j;
        }else {
            return -1;
        }
    }
}
